package service

import (
	"StrayAnimals/internal/initConfig"
	"StrayAnimals/internal/model"
	"errors"
	"github.com/google/uuid"
	"go.uber.org/zap"
	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

// IsEmailRegistered 检查邮箱是否已被注册
func IsEmailRegistered(email string) (bool, error) {
	var existingUser model.User
	err := initConfig.GormDb.Where("Email = ?", email).First(&existingUser).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			// 邮箱未注册
			return false, nil
		} else {
			// 其他数据库错误
			zap.L().Error("无法检查邮箱的注册状态", zap.Error(err))
			return false, err
		}
	} else {
		// 邮箱已注册
		zap.L().Info("用户邮箱已经被注册，请直接登录")
		return true, nil
	}
}

// EncryptPassword 加密密码
func EncryptPassword(password string) ([]byte, error) {
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		zap.L().Error("无法对用户密码进行加密", zap.Error(err))
		return hashedPassword, err
	}
	return hashedPassword, nil
}

// CreateNewUser 创建新用户
func CreateNewUser(newUser model.User) error {
	err := initConfig.GormDb.Create(&newUser).Error
	if err != nil {
		zap.L().Error("无法在数据库中创建新用户", zap.Error(err))
		return err
	}
	return nil
}

// GetUserByEmail 根据邮箱查询用户信息
func GetUserByEmail(email string) (*model.User, error) {
	var user model.User
	err := initConfig.GormDb.Where("Email = ?", email).First(&user).Error
	if err != nil {
		zap.L().Error("无法通过邮箱找到指定用户", zap.Error(err))
		return nil, err
	}
	return &user, nil
}

// CheckPassword 检验密码是否正确
func CheckPassword(hashedPassword, inputPassword string) error {
	// 确保加密密码不为空
	if hashedPassword == "" {
		zap.L().Error("无法检查密码，因为加密密码为空")
	}

	// 使用 bcrypt 验证密码
	err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(inputPassword))
	if err != nil {
		zap.L().Error("无法检查密码", zap.Error(err))
		return err
	}
	return nil
}

// GetUserByID 根据ID查找用户
func GetUserByID(id string) (*model.User, error) {
	var user model.User
	err := initConfig.GormDb.Where("ID = ?", id).First(&user).Error
	if err != nil {
		zap.L().Error("无法通过ID获取用户", zap.Error(err))
		return nil, err
	}
	return &user, nil
}

// UpdateUser 更新用户信息
func UpdateUser(user *model.User) error {
	err := initConfig.GormDb.Save(user).Error
	if err != nil {
		zap.L().Error("无法更新用户的基本信息", zap.Error(err))
		return err
	}
	return nil
}

// SaveHistoryAvatar 保存历史头像（避免重复保存相同的头像）
func SaveHistoryAvatar(userID string, avatar string) error {
	// 检查是否已经存在相同的记录
	var count int64
	err := initConfig.GormDb.Table("history_avatar").
		Where("userID = ? AND avatar = ?", userID, avatar).
		Count(&count).Error

	if err != nil {
		zap.L().Error("查询历史头像失败", zap.Error(err))
		return err
	}

	// 如果已经存在，跳过保存
	if count > 0 {
		zap.L().Info("该用户已存在相同的头像记录，跳过保存",
			zap.String("userID", userID),
			zap.String("avatar", avatar))
		return nil
	}

	// 如果不存在，则保存
	var historyAvatar model.HistoryAvatar
	historyAvatar.ID = uuid.New().String()
	historyAvatar.UserID = userID
	historyAvatar.Avatar = avatar
	err = initConfig.GormDb.Save(&historyAvatar).Error
	if err != nil {
		zap.L().Error("无法保存头像到历史头像库", zap.Error(err))
		return err
	}

	zap.L().Info("成功保存新的历史头像记录",
		zap.String("userID", userID),
		zap.String("avatar", avatar))

	return nil
}

// GetHistoryAvatar 获取用户的历史头像列表
func GetHistoryAvatar(userID string) ([]string, error) {
	var avatars []string

	// 直接查询 avatar 字段，避免加载整个结构体
	err := initConfig.GormDb.Model(&model.HistoryAvatar{}).
		Where("userID = ?", userID).
		Pluck("avatar", &avatars).Error

	if err != nil {
		zap.L().Error("无法获取历史头像", zap.Error(err))
		return nil, err
	}

	return avatars, nil
}
